Все говорят, что VB для DB это вообще. VC для DB это тоже нормально. Вы наверно видели во многих книгах начинается работа с DB, как легко просматривать записи ??? Ну, мол, вперед назад и так далее. Давайте сделаем примерно такой же проект на основе диалогового окна.

Помещаем две кнопки и элемент редактирования, который связываем с переменной m_Name. Добавляем в описание класса диалогового окна классы баз данных, незабыв объявить ссылку на DAO:
#include "afxdao.h"
/////////////////////////
// CTestDBDlg dialog
class CTestDBDlg : public CDialog
{
// Construction
public:
CDaoRecordset* cDaoRset;
CDaoDatabase cDaoDB;
CTestDBDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CTestDBDlg)
enum { IDD = IDD_TESTDB_DIALOG };
CString m_Name;
//}}AFX_DATA
......
};
Теперь при запуске диалогового окна нам нужно настроить объекты базы данных и получить набор записей.
BOOL CTestDBDlg::OnInitDialog()
{
CDialog::OnInitDialog();
......
// TODO: Add extra initialization here
cDaoDB.Open("c:/vb/step/step.mdb");
if (!cDaoDB.IsOpen()) return FALSE;
cDaoRset = new CDaoRecordset(&cDaoDB);
cDaoRset->Open( AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM TABLE1");
cDaoRset->MoveFirst();
COleVariant CValue;
cDaoRset->GetFieldValue("Name",CValue);
m_Name=CValue.pbVal;
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}
Но раз есть динамические объекты их нужно и удалять:
void CTestDBDlg::PostNcDestroy()
{
delete cDaoRset;
cDaoDB.Close();
CDialog::PostNcDestroy();
}
Код кнопок:
void CTestDBDlg::OnLeft()
{
try {
if (cDaoRset->IsBOF()) AfxMessageBox("eof");
else
{
if (cDaoRset->IsEOF()) cDaoRset->MovePrev();
cDaoRset->MovePrev();
COleVariant CValue;
cDaoRset->GetFieldValue("Name",CValue);
m_Name=CValue.pbVal;
UpdateData(FALSE);
}
}
catch(...)
{
}
}
void CTestDBDlg::OnRigth()
{
try {
if (cDaoRset->IsEOF()) AfxMessageBox("eof");
else
{
if (cDaoRset->IsBOF()) cDaoRset->MoveNext();
cDaoRset->MoveNext();
COleVariant CValue;
cDaoRset->GetFieldValue("Name",CValue);
m_Name=CValue.pbVal;
UpdateData(FALSE);
}
}
catch(...)
{
}
}
Обратите внимание на то, что я делал вот такие вещи:
if (cDaoRset->IsBOF()) cDaoRset->MoveNext(); cDaoRset->MoveNext();
Это связано с тем, что когда курсор уходит за последнею запись нужно два раза вызывать метод MoveNext() в данном случае, чтобы перейти на вторую записью. Ну, вот и все. Работайте пожалуйста, ходите вперед назад как захотите...